The data was stored in csv format and loaded into R using “read_csv” command.
library(readr)
GA_SNAPstores_2008_2016_GeoID <- read_csv("D:/Dropbox/course/INFO 8000/Assignment3/GA_SNAPstores_2008_2016_GeoID.csv")
Parsed with column specification:
cols(
.default = col_character(),
SNAP_ID = col_integer(),
NAICS_SHOR = col_integer(),
SIZE_CODE = col_integer(),
LARGE_CODE = col_integer(),
ZIP5 = col_integer(),
ZIP6 = col_integer(),
LONG = col_double(),
LAT = col_double(),
TRACTID = col_double(),
PUMAID = col_integer(),
CTYID = col_integer()
)
See spec(...) for full column specifications.
head(GA_SNAPstores_2008_2016_GeoID,n=5)
Then we use “ggplot2” package" to draw a bar chart to visualize the distributions of SNAP-authorized store types.
ggplot(GA_SNAPstores_2008_2016_GeoID,aes(x=GA_SNAPstores_2008_2016_GeoID$STTYPE))+
xlab("Store types")+
ggtitle("Distribution of SNAP-authorized store types")+
geom_bar(stat = "count")+
coord_flip()+
theme_bw()

As we can see, most of the SNAP-authorized stores are convenience stores.
Then we make a word cloud of the store names using “tm”,“wordcloud”,“RColorBrewer” packages.
#load needed packages
library(tm)
library(wordcloud)
library(RColorBrewer)
#create corpus
storename_corpus = Corpus(VectorSource(GA_SNAPstores_2008_2016_GeoID$NAME))
#build a term-document matrix
tdm = TermDocumentMatrix(storename_corpus,control = list(removePunctuation = TRUE,
stopwords = c("supermarket","shop","food","foods","mart","grocery","store","stop","llc","market","inc", stopwords("english")),
removeNumbers = TRUE, toupper = TRUE))
# define tdm as matrix
m = as.matrix(tdm)
# get word counts in decreasing order
word_freqs = sort(rowSums(m), decreasing=TRUE)
# create a data frame with words and their frequencies
dm = data.frame(word=names(word_freqs), freq=word_freqs)
#visualize
wordcloud(dm$word, dm$freq, max.words=200, random.order=FALSE, colors=brewer.pal(8, "Dark2"))

Finally we use “leaflet” packages to visualize the locations of each store and explore the general pattern of it.Click the circle, then you can see the pop up window.
#load "leaflet" package
library(leaflet)
#define popups
map_popup <- paste0("<strong>Store Name: </strong>",
GA_SNAPstores_2008_2016_GeoID$NAME,
"<br/><strong>Store Type: </strong>",
GA_SNAPstores_2008_2016_GeoID$STTYPE)
#Calculate mean center to set the view center
meanX<-mean(GA_SNAPstores_2008_2016_GeoID$LONG)
meanY<-mean(GA_SNAPstores_2008_2016_GeoID$LAT)
#Map showing all SNAP authorized stores locations
leaflet() %>%
addTiles() %>%
setView(meanX, meanY,zoom=7) %>%
addCircleMarkers(GA_SNAPstores_2008_2016_GeoID$LONG,
GA_SNAPstores_2008_2016_GeoID$LAT,
radius = 0.5,
color = "#03F",
popup=map_popup)
If the points are too messy, we can use cluster option.Click the cluster circle, the cluster will zomm in.
leaflet() %>%
addTiles() %>%
setView(meanX, meanY,zoom=7) %>%
addCircleMarkers(GA_SNAPstores_2008_2016_GeoID$LONG,
GA_SNAPstores_2008_2016_GeoID$LAT,
radius = 0.5,
color = "#03F",
popup=map_popup,clusterOptions = markerClusterOptions())
LS0tDQp0aXRsZTogIk5vdGVib29rIGZvciBJbmZvODAwMCBBc3NpZ25tZW50MyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KVGhlIGRhdGEgd2FzIHN0b3JlZCBpbiBjc3YgZm9ybWF0IGFuZCBsb2FkZWQgaW50byBSIHVzaW5nICJyZWFkX2NzdiIgY29tbWFuZC4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KR0FfU05BUHN0b3Jlc18yMDA4XzIwMTZfR2VvSUQgPC0gcmVhZF9jc3YoIkQ6L0Ryb3Bib3gvY291cnNlL0lORk8gODAwMC9Bc3NpZ25tZW50My9HQV9TTkFQc3RvcmVzXzIwMDhfMjAxNl9HZW9JRC5jc3YiKQ0KaGVhZChHQV9TTkFQc3RvcmVzXzIwMDhfMjAxNl9HZW9JRCxuPTUpDQpgYGANCg0KVGhlbiB3ZSB1c2UgImdncGxvdDIiIHBhY2thZ2UiIHRvIGRyYXcgYSBiYXIgY2hhcnQgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIFNOQVAtYXV0aG9yaXplZCBzdG9yZSB0eXBlcy4NCg0KYGBge3J9DQpnZ3Bsb3QoR0FfU05BUHN0b3Jlc18yMDA4XzIwMTZfR2VvSUQsYWVzKHg9R0FfU05BUHN0b3Jlc18yMDA4XzIwMTZfR2VvSUQkU1RUWVBFKSkrDQogIHhsYWIoIlN0b3JlIHR5cGVzIikrDQogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBTTkFQLWF1dGhvcml6ZWQgc3RvcmUgdHlwZXMiKSsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2J3KCkNCmBgYA0KQXMgd2UgY2FuIHNlZSwgbW9zdCBvZiB0aGUgU05BUC1hdXRob3JpemVkIHN0b3JlcyBhcmUgY29udmVuaWVuY2Ugc3RvcmVzLg0KDQpUaGVuIHdlIG1ha2UgYSB3b3JkIGNsb3VkIG9mIHRoZSBzdG9yZSBuYW1lcyB1c2luZyAidG0iLCJ3b3JkY2xvdWQiLCJSQ29sb3JCcmV3ZXIiIHBhY2thZ2VzLg0KDQpgYGB7cn0NCiNsb2FkIG5lZWRlZCBwYWNrYWdlcw0KbGlicmFyeSh0bSkNCmxpYnJhcnkod29yZGNsb3VkKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiNjcmVhdGUgY29ycHVzDQpzdG9yZW5hbWVfY29ycHVzID0gQ29ycHVzKFZlY3RvclNvdXJjZShHQV9TTkFQc3RvcmVzXzIwMDhfMjAxNl9HZW9JRCROQU1FKSkNCg0KI2J1aWxkIGEgdGVybS1kb2N1bWVudCBtYXRyaXgNCnRkbSA9IFRlcm1Eb2N1bWVudE1hdHJpeChzdG9yZW5hbWVfY29ycHVzLGNvbnRyb2wgPSBsaXN0KHJlbW92ZVB1bmN0dWF0aW9uID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3B3b3JkcyA9IGMoInN1cGVybWFya2V0Iiwic2hvcCIsImZvb2QiLCJmb29kcyIsIm1hcnQiLCJncm9jZXJ5Iiwic3RvcmUiLCJzdG9wIiwibGxjIiwibWFya2V0IiwiaW5jIiwgc3RvcHdvcmRzKCJlbmdsaXNoIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTnVtYmVycyA9IFRSVUUsIHRvdXBwZXIgPSBUUlVFKSkNCg0KIyBkZWZpbmUgdGRtIGFzIG1hdHJpeA0KbSA9IGFzLm1hdHJpeCh0ZG0pDQoNCiMgZ2V0IHdvcmQgY291bnRzIGluIGRlY3JlYXNpbmcgb3JkZXINCndvcmRfZnJlcXMgPSBzb3J0KHJvd1N1bXMobSksIGRlY3JlYXNpbmc9VFJVRSkgDQoNCiMgY3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHdvcmRzIGFuZCB0aGVpciBmcmVxdWVuY2llcw0KZG0gPSBkYXRhLmZyYW1lKHdvcmQ9bmFtZXMod29yZF9mcmVxcyksIGZyZXE9d29yZF9mcmVxcykNCiN2aXN1YWxpemUNCndvcmRjbG91ZChkbSR3b3JkLCBkbSRmcmVxLCBtYXgud29yZHM9MjAwLCByYW5kb20ub3JkZXI9RkFMU0UsIGNvbG9ycz1icmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KYGBgDQoNCkZpbmFsbHkgd2UgdXNlICJsZWFmbGV0IiBwYWNrYWdlcyB0byB2aXN1YWxpemUgdGhlIGxvY2F0aW9ucyBvZiBlYWNoIHN0b3JlIGFuZCBleHBsb3JlIHRoZSBnZW5lcmFsIHBhdHRlcm4gb2YgaXQuQ2xpY2sgdGhlIGNpcmNsZSwgdGhlbiB5b3UgY2FuIHNlZSB0aGUgcG9wIHVwIHdpbmRvdy4NCg0KYGBge3J9DQojbG9hZCAibGVhZmxldCIgcGFja2FnZQ0KbGlicmFyeShsZWFmbGV0KQ0KI2RlZmluZSBwb3B1cHMNCm1hcF9wb3B1cCA8LSBwYXN0ZTAoIjxzdHJvbmc+U3RvcmUgTmFtZTogPC9zdHJvbmc+IiwgDQogICAgICAgICAgICAgICAgICAgIEdBX1NOQVBzdG9yZXNfMjAwOF8yMDE2X0dlb0lEJE5BTUUsDQogICAgICAgICAgICAgICAgICAgICI8YnIvPjxzdHJvbmc+U3RvcmUgVHlwZTogPC9zdHJvbmc+IiwNCiAgICAgICAgICAgICAgICAgICAgR0FfU05BUHN0b3Jlc18yMDA4XzIwMTZfR2VvSUQkU1RUWVBFKQ0KDQojQ2FsY3VsYXRlIG1lYW4gY2VudGVyIHRvIHNldCB0aGUgdmlldyBjZW50ZXINCm1lYW5YPC1tZWFuKEdBX1NOQVBzdG9yZXNfMjAwOF8yMDE2X0dlb0lEJExPTkcpDQptZWFuWTwtbWVhbihHQV9TTkFQc3RvcmVzXzIwMDhfMjAxNl9HZW9JRCRMQVQpDQoNCiNNYXAgc2hvd2luZyBhbGwgU05BUCBhdXRob3JpemVkIHN0b3JlcyBsb2NhdGlvbnMNCmxlYWZsZXQoKSAlPiUgDQogIGFkZFRpbGVzKCkgJT4lIA0KICBzZXRWaWV3KG1lYW5YLCBtZWFuWSx6b29tPTcpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKEdBX1NOQVBzdG9yZXNfMjAwOF8yMDE2X0dlb0lEJExPTkcsDQogICAgICAgICAgICAgICAgICAgR0FfU05BUHN0b3Jlc18yMDA4XzIwMTZfR2VvSUQkTEFULA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDAuNSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMDNGIiwNCiAgICAgICAgICAgICAgICAgICBwb3B1cD1tYXBfcG9wdXApDQpgYGANCg0KSWYgdGhlIHBvaW50cyBhcmUgdG9vIG1lc3N5LCB3ZSBjYW4gdXNlIGNsdXN0ZXIgb3B0aW9uLkNsaWNrIHRoZSBjbHVzdGVyIGNpcmNsZSwgdGhlIGNsdXN0ZXIgd2lsbCB6b21tIGluLg0KDQpgYGB7cn0NCmxlYWZsZXQoKSAlPiUgDQogIGFkZFRpbGVzKCkgJT4lIA0KICBzZXRWaWV3KG1lYW5YLCBtZWFuWSx6b29tPTcpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKEdBX1NOQVBzdG9yZXNfMjAwOF8yMDE2X0dlb0lEJExPTkcsDQogICAgICAgICAgICAgICAgICBHQV9TTkFQc3RvcmVzXzIwMDhfMjAxNl9HZW9JRCRMQVQsDQogICAgICAgICAgICAgICAgICByYWRpdXMgPSAwLjUsDQogICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMDNGIiwNCiAgICAgICAgICAgICAgICAgIHBvcHVwPW1hcF9wb3B1cCxjbHVzdGVyT3B0aW9ucyA9IG1hcmtlckNsdXN0ZXJPcHRpb25zKCkpDQpgYGANCg0KDQoNCg==